package fr.expdev.bndd;

import java.util.Iterator;
import java.util.List;

import android.app.Dialog;
import android.content.Intent;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;

import fr.expdev.bndd.data.Configuration;
import fr.expdev.bndd.data.Post;
import fr.expdev.bndd.data.PostsAsyncTask;
import fr.expdev.bndd.data.sqlite.PostsSQLite;
import fr.expdev.bndd.widget.PostItem;
import greendroid.app.GDActivity;
import greendroid.widget.ActionBarItem;
import greendroid.widget.ItemAdapter;
import greendroid.widget.LoaderActionBarItem;
import greendroid.widget.NormalActionBarItem;
import greendroid.widget.ActionBar.Type;
import greendroid.widget.item.Item;
import greendroid.widget.item.ThumbnailItem;

public class MainActivity extends GDActivity implements ActivityRefreshable {

	/**
	 * TAG pour le logger
	 */
	private static final String	TAG		= "Main";

	/**
	 * Widget ListView qui presente les posts
	 */
	protected ListView				listView;

	/**
	 * Adapter pour la liste de posts
	 */
	protected final ItemAdapter	adapter	= new ItemAdapter(this);

	/**
	 * Item de l'ActionBar Il s'agit de l'item de refresh
	 */
	protected LoaderActionBarItem	loaderItem;

	/**
	 * Listener qui réagit au clic sur un element de la liste
	 */
	protected OnItemClickListener	itemClickHandler;

	private static MainActivity	main;

	public MainActivity() {
		super(Type.DASHBOARD);
		MainActivity.main = this;

		itemClickHandler = new OnItemClickListener() {

			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				Intent intent = new Intent(MainActivity.this,
						DetailPostActivity.class);
				Iterator<Post> i = AppContext.getInstance().getPosts().iterator();
				int x = 0;

				// On recherche l'élément cliqué
				while (i.hasNext()) {
					Post p = i.next();
					if (x++ == position) {
						intent.putExtra("post", p);
						break;
					}
				}

				startActivity(intent);
			}
		};
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setActionBarContentView(R.layout.list);

		initActionBar();

		// Si on vient de créer l'Activity (pas juste une rotation de l'écran)
		if (AppContext.getInstance().getPosts().size() == 0) {
			boolean shouldReloadPosts = Configuration.getInstance(this)
					.isRefreshAtStartupEnabled();

			if (shouldReloadPosts) {
				// On affiche un item de chargement
				Item waitingItem = new ThumbnailItem(getString(R.string.loading),
						getString(R.string.please_wait),
						Post.Type.LOADING.getResource());
				waitingItem.enabled = false;
				adapter.add(waitingItem);
			}

			// On lit la base de données
			PostsSQLite db = new PostsSQLite(this);
			db.open(false);
			List<Post> newPosts = db.selectAllPosts();
			db.close();

			// S'il y a des posts chargés depuis la base de données on les ajoute à
			// l'AppContext
			if (newPosts.size() > 0) {
				AppContext.getInstance().getPosts().addAll(newPosts);
				refreshAdapter();
			}

			// Si la configuration l'autorise on va voir sur le serveur s'il y a
			// des nouveaux posts
			if (shouldReloadPosts) {
				reloadPosts();
			}

		} else {

			// On rafraichit l'adapter
			refreshAdapter();

		}

		listView = (ListView)findViewById(android.R.id.list);
		listView.setAdapter(adapter);
		listView.setOnItemClickListener(itemClickHandler);

	}

	/**
	 * Initialisation de l'ActionBar
	 */
	protected void initActionBar() {
		addActionBarItem(ActionBarItem.Type.Refresh);

		loaderItem = (LoaderActionBarItem)getActionBar().getItem(0);

		final ActionBarItem item = getActionBar()
				.newActionBarItem(NormalActionBarItem.class)
				.setDrawable(R.drawable.ab_favorite)
				.setContentDescription(R.string.gd_export);
		addActionBarItem(item);
	}

	/**
	 * Clic sur l'ActionBar
	 */
	@Override
	public boolean onHandleActionBarItemClick(ActionBarItem item, int position) {
		switch (position) {
			case 0:
				reloadPosts();
				break;
			case 1:
				Intent intent = new Intent(MainActivity.this,
						FavoritesActivity.class);
				startActivity(intent);
				break;
			default:
				return super.onHandleActionBarItemClick(item, position);
		}
		return true;
	}

	/**
	 * Methode appelee a la fin de l'application Elle Kill le processus pour
	 * liberer la memoire
	 */
	@Override
	public void finish() {
		super.finish();
		System.exit(RESULT_OK);
	}

	/**
	 * Creation du menu
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater menuInflater = getMenuInflater();
		menuInflater.inflate(R.menu.rssmenu, menu);
		return true;
	}

	/**
	 * Methode de callback appelee apres la selection d'un element du menu
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
			case R.id.menu_refresh:
				reloadPosts();
				return true;

			case R.id.menu_infos:
				final Dialog infosDialog = new Dialog(this);
				infosDialog.setTitle(getString(R.string.app_informations));
				infosDialog.setContentView(R.layout.infos_dialog);

				String versionName;
				try {
					versionName = getPackageManager().getPackageInfo(
							getPackageName(), 0).versionName;
				} catch (NameNotFoundException e) {
					versionName = getString(R.string.undefined);
					e.printStackTrace();
				}
				final String content = String.format(
						getString(R.string.infos_changelog), versionName);

				((WebView)infosDialog.findViewById(R.id.infos_dialog_changelog))
						.loadDataWithBaseURL(
								"http://www.experience-developpement.fr/", content,
								"text/html", "utf-8", "about:blank");

				infosDialog.show();
				return true;
			case R.id.menu_configuration:
				Intent intent = new Intent(MainActivity.this,
						ConfigurationActivity.class);
				startActivity(intent);
				break;
		}
		return false;
	}

	/**
	 * (Re)lance le chargement des posts sur le site
	 */
	private void reloadPosts() {
		loaderItem.setLoading(true);
		PostsAsyncTask task = new PostsAsyncTask(this);
		task.execute("http://www.experience-developpement.fr/feed/");
	}

	/**
	 * Methode de callback pour le chargement asychrone des posts
	 * 
	 * @param posts
	 */
	public void notifyNewPosts(List<Post> posts) {
		if (posts.size() == 0) {

			Log.e(TAG, "Aucun article n'a été chargé");

		} else {

			AppContext application = AppContext.getInstance();
			PostsSQLite db = new PostsSQLite(this);

			db.open(true);
			for (Post new_post : posts) {
				if (!application.getPosts().contains(new_post)) {
					db.insert(new_post);
					application.getPosts().add(new_post);
				}
			}
			db.close();

			// On actualise l'affichage
			refreshAdapter();

		}

		loaderItem.setLoading(false);
	}

	/**
	 * Rafraichir l'affichage des posts avec les Posts de l'AppContext
	 */
	public void refreshAdapter() {
		adapter.clear();
		Iterator<Post> i = AppContext.getInstance().getPosts().iterator();

		while (i.hasNext()) {
			Post post = (Post)i.next();
			adapter.add(new PostItem(this, post));
		}
		adapter.notifyDataSetChanged();
	}

	public static MainActivity getInstance() {
		return MainActivity.main;
	}
}